量化咖(lhk.ai)UI 设计梳理
本文以 lhk.ai 线上产物为唯一事实来源,逐层拆解其 UI 设计:先讲行为(用户如何与界面交互、页面如何被加载),再讲结构(界面由哪些组件与令牌构成),最后给出可直接复用的速查手册与逆向复刻操作手册。
事实来源:
https://lhk.ai 的 HTML 外壳、/assets/css/index.JcVxZNbQ.css、/assets/js/index.DVIthQbW.js、/assets/js/LandingHome.Ce2MMH2o.js、/assets/css/LandingHome.Luxm4zym.css 等公开静态产物。文中所有色值、尺寸、层级均来自这些文件。
1. 概述
1.1 产品定位与技术栈
量化咖(英文 LHK Quant)是一个面向全球市场的量化交易 SaaS 平台,标语「让量化交易更简单」。产品覆盖行情研究、指标绘图、策略构建与回测、策略广场跟投、AI 自主实盘托管、数据中心与内容学习等完整链路,同时提供中英双语。
| 维度 | 选型 | 说明 |
|---|---|---|
| 前端框架 | Vue 3 + Vite | 单页应用(SPA),按路由懒加载页面 chunk |
| UI 组件库 | Element Plus | 被大量 CSS 变量覆盖定制,形成自有视觉 |
| 图标 | Tabler Icons (Vue) | 线性图标,头部与卡片统一使用 |
| 图表引擎 | ECharts / TradingView / lightweight-charts | 超级图表与数据中心看板 |
| 字体 | Inter(fontsource 自带) | 正文;数字使用等宽字体 |
| 国际化 | vue-i18n(zh / en) | 头部可切换语言,键值内嵌于主 bundle |
| 主题 | CSS 变量 + data-app-theme | 默认暗色,可选亮色,localStorage 持久化 |
- SPA(Single Page Application,单页应用)
- 首次加载 HTML 外壳与 JS bundle,后续页面切换由前端路由完成、按需拉取 chunk,不整页刷新。
- Chunk(代码分块)
- Vite 打包产物的最小懒加载单元,如
LandingHome.xxx.js、ChartWorkspace等。
1.2 双设计体系(两套视觉语言并存)
lhk.ai 的 UI 并非单一风格,而是刻意分成两层,服务两类完全不同的场景:
| 维度 | 营销 / 落地页体系 | 应用 / 工作台体系 |
|---|---|---|
| 覆盖页面 | / 首页、关于我们、政策页 | 登录后所有功能页(图表、策略、数据中心、后台) |
| 视觉基调 | 黑白极简、编辑风、超大标题 | 蓝色企业风、暗色优先、信息密度高 |
| 主色 | 黑 #111214 / 白 #ffffff | 品牌蓝 #2446a3 / 强调蓝 #2563eb |
| 头部 | landing-header 高 76px,滚动毛玻璃 | public-header 高 60px,带 Mega Menu |
| 组件来源 | 高度定制,几乎不直接用 Element 外观 | Element Plus + 自有 Dialog/Dropdown token |
设计意图:营销层负责「品牌感与转化」,用大留白与克制动效建立专业信任;应用层负责「效率与密度」,用暗色与统一令牌降低长时间盯盘的视觉疲劳。
1.3 逆向方法(本文如何得出)
- 抓取
index.html:得到主题引导脚本、初始加载层结构、静态资源清单。 - 抓取
index.css:提取全部:root自定义属性(Design Token)与组件样式。 - 抓取
index.js:提取路由表、懒加载 chunk 映射、i18n 键值、组件类名。 - 抓取
LandingHome.*与LandingHome.css:还原落地页专属设计与独立令牌。
2. 行为图
行为图回答「系统做什么、用户怎么走」。顺序为:用例图(整体行为)→ 活动图(核心旅程)→ 时序图(加载与主题)→ 状态图(会话生命周期)。
2.1 用例图(整体行为)
图 2-1 用例图:五类角色 × 量化咖 Web 应用的完整功能边界
- Use Case Diagram(用例图)
- UML 行为图之一,描述「参与者(Actor)」与「系统提供的能力」之间的关系,用来界定系统边界。
- Mega Menu(超级菜单)
- 头部「所有功能」下拉面板,一次性平铺展示多组功能卡与快速入口,替代多级菜单。
2.2 活动图:核心用户旅程
从访客到达落地页,到注册、选择路径、最终把策略跑在实盘上,是产品的主干路径。下图用 fork 表达「逛行情 / 抄策略 / 自建策略」三条并行支线。
图 2-2 活动图:从落地页到 AI 实盘托管的主流程
2.3 时序图:首屏加载与主题初始化
主题必须在首帧就正确,否则会「白闪」(FOUC)。因此主题读取被放在 HTML 头部的一段内联脚本中,先于任何 bundle 执行;随后 Vue 挂载、路由解析、懒加载页面 chunk、请求后端数据。
图 2-3 时序图:从 HTTP 请求到页面渲染、再到主题切换的完整调用链
- FOUC(Flash of Unstyled Content,样式闪烁)
- 页面先用默认样式渲染、随后被 JS/CSS 覆盖而产生的瞬间闪烁。量化咖用内联主题脚本 + 初始加载层规避。
- localStorage
- 浏览器本地持久化存储。量化咖用键
lhk:app:theme:v2记住用户主题选择。
2.4 状态图:会话与会员状态
图 2-4 状态图:访客 → 登录 → 会员 → 退出的生命周期
3. 结构图
结构图回答「界面由什么组成」。顺序为:部署图(宏观运行环境)→ 组件图(应用与组件依赖)→ 包图(分层架构)→ 类图(设计系统对象模型),层层细化。
3.1 部署图
图 3-1 部署图:浏览器运行时、静态资源服务器 / CDN、后端服务集群
- Deployment Diagram(部署图)
- UML 结构图之一,描述软件构件在物理/逻辑节点上的分布与通信关系。
- CDN(Content Delivery Network,内容分发网络)
- 就近分发静态资源(JS/CSS/视频),降低首屏延迟。量化咖的
/assets/*与/media/*即为此类资源。
3.2 组件图
图 3-2 组件图:应用外壳、业务页面、基础组件、底层依赖四层
3.3 包图
图 3-3 包图:Layout / Page / Component / Token / Foundation 五层
- Atomic Design(原子化设计)
- 把界面拆为原子(Atom)→ 分子(Molecule)→ 有机体(Organism)→ 模板(Template)→ 页面(Page)的设计方法论。量化咖的 Component 层即对应原子与分子。
3.4 类图:设计系统对象模型
图 3-4 类图:DesignToken / ThemeProfile / AppShell 及核心 UI 对象的属性与方法
4. 设计语言与 Design Token
量化咖通过 CSS 自定义属性(CSS Variables)实现真正的「令牌化」:颜色、字体、圆角、阴影、层级全部以变量表达,换肤与品牌调整只需改变量。
- Design Token(设计令牌)
- 把设计决策(颜色、间距、字体等)抽象为与平台无关的命名变量,是设计系统与代码之间的契约。
- CSS Variables(CSS 自定义属性)
- 以
--name: value声明、var(--name)引用的原生 CSS 能力,支持继承与运行时切换。
4.1 字体与字号
| 令牌 | 值 | 用途 |
|---|---|---|
--site-font-family | Inter, "PingFang SC", "Microsoft YaHei", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif | 全局正文 |
--site-number-font-family | "JetBrains Mono", "SFMono-Regular", Consolas, monospace | 行情数字、代码 |
--frist-title | 23px(移动 20px) | 一级标题 |
--second-title | 16px(移动 15px) | 二级标题 |
--third-title | 14px | 三级标题 / 正文 |
4.2 颜色系统
应用体系令牌
| 令牌 | 色值 | 说明 |
|---|---|---|
--primary-color | #2446a3 | 品牌主色 |
--hover_color | #3370ff | 悬停/高亮 |
--app-accent-blue | #2563eb | 强调蓝(新) |
--app-accent-blue-hover | #1d4ed8 | 强调蓝悬停 |
--app-selection-active-bg | #eff6ff | 选中底色 |
--app-selection-active-text | #2563eb | 选中文字 |
语义色(亮 / 暗两套)
| 语义 | 亮色 | 暗色 |
|---|---|---|
| 成功 Success | #0f9f74 | #22ab94 |
| 警告 Warning | #d97706 | #f0a54a |
| 错误 Error | #dc3545 | #f7525f |
| 信息 Info | #2563eb | #5b8ff9 |
| 消息面板底色 | #ffffff | #202328 |
| 消息文字 | #1f2937 | #f1f5f9 |
落地页体系令牌(独立命名空间)
| 令牌 | 亮色 | 暗色 |
|---|---|---|
--page-bg | #ffffff | #090a0c |
--ink | #111214 | #f1f2f3 |
--ink-strong | #050607 | #ffffff |
--muted | #666b73 | #a4a8af |
--button-bg / --button-text | #111214 / #ffffff | #f4f5f6 / #0b0c0e |
--media-frame | linear-gradient(118deg, #2f6cff 0%, #0a347f 100%) | |
- Anticipated Contrast(对比度)
- 文本与背景的明度差。暗色底
#0d0f12配#f1f5f9文字,对比度满足 WCAG AA,适合长时间阅读。 - WCAG(Web Content Accessibility Guidelines)
- W3C 发布的无障碍标准,AA 级要求正文对比度 ≥ 4.5:1。
4.3 圆角 / 阴影 / 层级
| 类别 | 令牌 | 值 |
|---|---|---|
| 圆角 | --dropdown-radius / -item-radius | 5px / 4px |
| 圆角 | --lhk-dialog-radius | 12px |
| 圆角 | --media-radius | 14px |
| 阴影 | --dropdown-shadow | 0 10px 26px rgba(15,23,42,.12), 0 2px 8px rgba(15,23,42,.05) |
| 阴影 | --lhk-dialog-shadow | 0 25px 50px -12px rgba(15,23,42,.35) |
| 遮罩 | --lhk-dialog-overlay-bg | rgba(15,23,42,.5) |
| 滚动条 | --site-scrollbar-size | 6px,滑块 rgba(100,116,139,.55) |
z-index 采用「业务分层 + 明确号段」策略,避免弹层互相遮盖:
| 层级令牌 | 值 | 层 |
|---|---|---|
| skip-link | 2000 | 跳到主要内容 |
--lhk-live-modal-z-index | 2400 | 实盘弹窗 |
--lhk-live-popper-z-index | 2410 | 实盘下拉 |
--lhk-live-confirm-z-index | 2500 | 实盘确认框 |
--lhk-benefit-modal-z-index | 3200 / 3300 | 权益弹窗及子弹窗 |
--lhk-chart-learning-drawer-z-index | 3600 | 图表教学抽屉 |
--lhk-chart-learning-hint-z-index | 5200 | 图表提示 |
--lhk-chart-learning-guide-z-index | 7000 | 图表引导 |
--lhk-auth-sheet-z-index | 11000 | 登录浮层 |
--lhk-global-message-z-index | 12000 | 全局消息 |
--lhk-captcha-overlay-z-index | 13000 | 验证码浮层 |
4.4 主题机制
<html lang="en" data-app-theme="dark" data-initial-loading-theme="light">
<script>
const defaultTheme = 'dark'
const pathname = window.location.pathname.replace(/\/+$/, '') || '/'
const adaptiveLoadingTheme =
pathname === '/' || pathname === '/index' ||
pathname === '/chart' || pathname.startsWith('/chart/')
document.documentElement.dataset.initialLoadingTheme =
adaptiveLoadingTheme ? 'adaptive' : 'light'
try {
const storedTheme = window.localStorage.getItem('lhk:app:theme:v2')
document.documentElement.dataset.appTheme =
storedTheme === 'light' ? 'light' : defaultTheme
} catch {
document.documentElement.dataset.appTheme = defaultTheme
}
</script>
- 默认暗色:
data-app-theme默认dark。 - 持久化:键名
lhk:app:theme:v2,仅当值为light时切亮色。 - 自适应加载主题:首页与图表页使用
adaptive(暗色加载底#0d0f12),其余页面用亮色加载底#fff。 - 落地页独立切换:
landing-page--dark类,文案「切换到暗色/亮色模式」,0.24s 过渡。
5. 页面地图与核心页面 UI
路由体系按业务域划分,主要路径如下(meta.title 为浏览器标题):
| 业务域 | 代表路由 | 标题 |
|---|---|---|
| 营销首页 | / | 量化咖|让量化交易更简单 |
| 工作台 | /home、/home/overview、/home/strategyBuild | Control Center 系列 |
| 超级图表 | /chart、/chart/:chartId | 超级图表 |
| 策略 | /strategy、/strategy/detail/:id、/strategyBuild/* | 策略广场 / 策略构建器 |
| 数据中心 | /data-center、/data-center/module/:moduleKey | Quant Data Center |
| 内容学习 | /library、/school、/solution、/article/:type | 知识文库 / 新手学院 / 解决方案 |
| 商业化 | /vip、/payment/crypto | VIP Membership |
| 账户 | /home/securityPreference、/space/:userId | Security Center / User Space |
| 管理后台 | /systemAdmin、/systemUserList、/systemLiveMonitor | Admin Console 系列 |
| 移动端 | /mobile | 手机端 |
5.1 营销落地页(/)
- 头部:粘性,高 76px,三栏网格
minmax(150px,1fr) auto minmax(220px,1fr),最大宽 1500px;滚动或展开菜单后转为rgba(255,255,255,.9)毛玻璃(backdrop-filter: blur(18px) saturate(140%))。 - 导航:超级图表、产品定价、策略广场、策略构建、知识文库、新手学院、解决方案;hover 时下划线滑入。
- 工具区:语言切换、主题切换、汉堡菜单均为 42px 圆形按钮;主 CTA「立刻开始」为黑底胶囊 + 圆形箭头,hover 上移 2px。
- Hero:居中,标题
clamp(52px, 5.4vw, 86px)、行高 0.98、字重 600;导语最大宽 840px、行高 1.8;两个 CTA「构建策略,立刻实盘」「探索策略广场」。 - 产品预览:Hero 下方内嵌
home-hero.mp4(+.hvc1/ webp 海报)视频,蓝色渐变描边与辉光投影。
- Hero(首屏主视觉区)
- 落地页第一屏的标题、导语与主行动按钮区域,承担核心信息传达与转化。
- Backdrop Filter(背景滤镜)
- 对元素背后的内容做模糊/饱和度处理,实现「毛玻璃」效果。需注意浏览器兼容与性能。
5.2 公共头部与 Mega Menu
- 应用头部高
--public-header-height: 60px(移动 56px),最大宽 1880px,左右内边距 26px(移动 18/12px)。 - 左侧品牌 Logo,中间「所有功能」触发 Mega Menu,右侧账户区。
- Mega Menu:最大宽 1500px,六张功能卡(策略构建中心、知识文库、新手学院、解决方案、策略广场、数据中心),每张含标题、描述、标签胶囊;侧栏为快速入口分组(官方创作者、平台支持、快速入口、注册、VIP 会员、工单支持);底部为号召区。
- 账户区:未登录显示「登录 / 注册」;已登录为头像触发器,下拉菜单含会员徽章、姓名、账户信息、安全中心、偏好设置、账单、收藏、关注、实盘、发布、工单、退出,支持暗色变体。
5.3 公共页脚
- 白底、上边框
#eef1f6、上下内边距 60px、内容最大宽 1300px、正文色#667085;列标题 16px / 700 /#111827。 - 三列 + 二维码:关于量化咖(关于我们、求职机会、隐私政策、服务条款、解决方案、公开索引与数据使用规则);产品(超级图表、甄选策略、投稿策略赚取收益、构建策略、知识文库、新手学院);服务(成为 VIP 会员、成为官方认证策略创作者、官方合作交易所、通过工单获取帮助);官方公众号 二维码。
5.4 超级图表工作台(/chart)
- 该路由
meta设置isHideHeader / isHideFooter = true,采用全屏工作区布局,最大化绘图与看盘面积。 - 能力:多市场行情 K 线、专业指标、绘图工具、自选表、价格警报、回放/复盘,并可在同一工作区保存分析进度。
- 含图表教学引导层(抽屉 z-index 3600、提示 5200、引导 7000),以及 AI 编码助手悬浮组件。
- 市场行情走势遵循国内习惯:红涨绿跌(
useUserUpColor控制涨跌配色)。
5.5 策略广场与策略构建
- 策略广场:卡片式浏览全球策略,支持一键跟投;含「甄选策略」「热门」「推荐」等 tab。
- 策略构建中心:零代码可视化建模,股票与期货两条线路(
strategyBuild/stock|*、strategyBuild/crypto/*),支持代码校验、指标计算、回测结果查看。 - 投稿与激励:投稿策略赚取收益、创作者激励、官方认证创作者体系。
5.6 数据中心(/data-center)
- 看板式布局:hero 主卡 + 模块卡(modules)、热力图(heat-grid)、宏观(macro)、板块轮动(rotation)、ETF、财富(wealth)、信号(signal)、时间线(timeline)、个股列表(stock-row)等区块。
- 采用
section--*卡片分节 +section-head标题栏 + 迷你走势sparkline,信息密度高。 - 含数据集(dataset)和模块(module)两类详情页,由
DataCenterFrame统一外壳承载。
5.7 会员与支付
- 会员分基础版、进阶版(Pro)、专业版(Pre)以及 VIP;权益矩阵通过
membership.capability.*文案描述(如 AI 全自动实盘、算力赠送、私享策略库、逐步回放、智能警报等)。 - 会员徽章
membership-badge有多套渐变色(金、紫蓝、橙、灰等),随等级变化。 - 支付支持支付宝 / 微信扫码,以及加密货币支付(
/payment/crypto);充值满额赠送 VIP 代金券。
5.8 账户中心与管理后台
- 账户中心:总览、账户信息、收藏与发布、关注、实盘、账单、工单、交易所接入、安全与偏好设置。
- 管理后台(Admin Console):用户与 VIP 管理、策略广场与模板管理、回测/实盘/算力/缓存/服务/错误监控、订单退款、K 线数据、图表警报、数据同步、流量调度等,以数据表格与监控面板为主。
5.9 移动端(/mobile)
- 独立路由
mobileHome,与桌面端共享设计令牌,但导航收敛为底部 tab / 抽屉形式。 - 头部在 ≤960px 切换汉堡菜单;功能卡转为纵向堆叠并隐藏描述文字。
6. 组件与交互规范
| 组件 | 关键令牌 / 类 | 规范 |
|---|---|---|
| 弹窗 Dialog | --lhk-dialog-* | 圆角 12px,标题 18px / 600 / #1e293b,正文 #334155,遮罩 rgba(15,23,42,.5),含进度计与 footer 左右分布 |
| 消息 MessageBox | lhk-modern-message-box | 统一 --app-message-*,亮/暗两套,四态语义色 |
| 下拉 Dropdown | --dropdown-* | 5px 圆角,选项高 32px,hover #f6f7f9,激活即选中蓝底 |
| 表格 DataTable | .lhk-table | 基于 el-table,表头底 #f8fafc |
| 按钮 Button | .el-button--* | 六态(default/primary/success/warning/danger/info)+ plain/text/link |
| 会员徽章 | membership-badge | 多套渐变 + 图标 |
| 控制台胶囊 | console-pill | 后台顶部标记样式 |
| 加载层 | html-initial-loading / route-loading | Logo clip-path 填充动画 1.6s |
交互一致性原则:所有浮层必须在既定 z-index 号段内(见 4.3),所有悬停/激活色必须走令牌,所有数值文本必须用等宽字体族。
7. 响应式与主题
- 断点:约 960px 与 640px 两级;头部内边距 26 → 18 → 12px;Mega 侧栏由多列转 2 列;功能卡纵向堆叠。
- 动效:下拉/导航 0.18–0.22s,主题切换 0.24s,Hero 入场
hero-enter--delay-1/2分级淡入,CTA hover 上移 2px。 - 无障碍:
skip-link(跳到主要内容)、aria-label、aria-expanded、focus-visible焦点态。
- Breakpoint(断点)
- 响应式设计中触发布局切换的视口宽度阈值。
- Focus-visible
- 仅在键盘聚焦时显示焦点轮廓的 CSS 伪类,兼顾可达性与鼠标体验。
8. 实战速查手册
8.1 Design Token 速查
| 用途 | 变量 | 值 |
|---|---|---|
| 品牌主色 | --primary-color | #2446a3 |
| 强调蓝 | --app-accent-blue | #2563eb |
| 暗色底 | --route-loading-bg | #0d0f12 |
| 头部高 | --public-header-height | 60px |
| 正文字体 | --site-font-family | Inter, PingFang SC... |
| 数字字体 | --site-number-font-family | JetBrains Mono... |
8.2 路由 / 层级 / 断点速查
| 问题 | 答案 |
|---|---|
| 主题存在哪? | localStorage['lhk:app:theme:v2'](仅 light 特殊,其余为 dark) |
| 图表页是否显示头尾? | 否,meta.isHideHeader/isHideFooter = true |
| 全局消息最高层级? | --lhk-global-message-z-index: 12000 |
| 验证码浮层? | --lhk-captcha-overlay-z-index: 13000 |
| 响应式断点? | 约 960px / 640px |
8.3 逆向复刻操作手册
- 取外壳:
curl -s https://lhk.ai,读取内联主题脚本与资源清单。 - 取令牌:抓取
/assets/css/index.*.css,用 grep 提取:root{...}与--*变量,即为完整 Design Token。 - 取路由:抓取
/assets/js/index.*.js,搜索path:"/"与name:"...",还原路由表与meta标题。 - 取文案:搜索
"xxx.key":"中文"键值对,得到全部 i18n 文案。 - 取落地页:定位
LandingHome.*.js/.css,得到营销层独立令牌与 Hero 规格。
# 一键提取主题令牌 curl -s https://lhk.ai/assets/css/index.JcVxZNbQ.css \ | grep -oE '\-\-[a-z0-9-]+: [^;}]+' | sort -u # 提取路由 curl -s https://lhk.ai/assets/js/index.DVIthQbW.js \ | grep -oE 'path:"[^"]+",name:"[^"]+"' | sort -u
注意:线上文件名带内容哈希(如
index.DVIthQbW.css),版本更新后会变化;复刻时应以 index.html 中引用的实际文件名为准,不要把哈希写死。